# -*- coding: UTF-8 -*-

import re
try:
    import xml.etree.ElementTree as ET
except:
    import cElementTree as ET

class Lazy(object) :
    def __init__(self) :
        self.ns = re.compile(r"\{(.*)\}(.*)")    # XML命名空间正则匹配编译对象

    def xml2dict(self,content,strip_root=True) :
        """"""""""""""""""""""""""""""""""""""""""""""""
         # XML转化为字典
         #
         # @author  lazyboy <lazyboy.fan@gmail.com>
         # @param   str content     XML内容
         # @param   bool stripRoot  是否去除根节点返回 默认:True
         # @return  dict
         # @todo
        """"""""""""""""""""""""""""""""""""""""""""""""
        el = ET.fromstring(content)
        tree = self.parse(el)
        return tree[1] if strip_root else {tree[0]:tree[1]}

    def parse(self,el) :
        """"""""""""""""""""""""""""""""""""""""""""""""
         # 解析XML文档节点信息
         #
         # @author  lazyboy <lazyboy.fan@gmail.com>
         # @param   object el       XML文档Element对象
         # @return  tuple
         # @todo
        """"""""""""""""""""""""""""""""""""""""""""""""
        tree = {}
        node = self.get_node(el)
        children = el.getchildren()
        # 是否有子节点
        if children :
            for item in children :
                tag,value = self.parse(item)
                # 子节点首次出现在父节点中
                if tag not in tree :
                    tree[tag] = value
                else :
                    # 子节点已在父节点中存在,则应转成list结构
                    if not isinstance(tree[tag],list) :
                        tree[tag] = [tree.pop(tag)]
                    tree[tag].append(value)
            return (node['tag'],tree)
        else :
            return (node['tag'],node['value'])

    def get_node(self,el) :
        """"""""""""""""""""""""""""""""""""""""""""""""
         # XML节点信息
         #
         # @author  lazyboy <lazyboy.fan@gmail.com>
         # @param   object el
         # @return  dict
         # @todo
        """"""""""""""""""""""""""""""""""""""""""""""""
        ns,tag = self.split_namespace(el.tag)
        return {'tag':tag,'value':el.text or '','attr':el.attrib,'namespace':ns}

    def split_namespace(self,tag) :
        """"""""""""""""""""""""""""""""""""""""""""""""
         # 分割节点tag中的命名空间
         #
         # @author  lazyboy <lazyboy.fan@gmail.com>
         # @param   str tag 节点标签
         # @return  tuple (namespace,tag)
         # @todo
        """"""""""""""""""""""""""""""""""""""""""""""""
        result = self.ns.search(tag)
        return result.groups() if result else ('',tag)

    def dict2xml(self,data,head_declare=False,encoding='UTF-8',version='1.0',root=None) :
        """"""""""""""""""""""""""""""""""""""""""""""""
         # 字典数据转成XML文档
         #
         # @author  lazyboy <lazyboy.fan@gmail.com>
         # @param   dict data
         # @param   bool head_declare   XML头部声明
         # @param   str encoding        XML编码
         # @param   str version         XML版本号
         # @param   mixed root          XML根节点
         # @return  str
         # @todo
        """"""""""""""""""""""""""""""""""""""""""""""""
        xml = ('<?xml version="%s" encoding="%s"?>' % (version,encoding)) if head_declare else ''
        tree = self.create_tree(data)
        if root :
            tree = self.create_tag(root,tree)
        xml += tree
        return xml

    def create_tree(self,data,key=None):
        """"""""""""""""""""""""""""""""""""""""""""""""
         # 创建XML文档树
         #
         # @author  lazyboy <lazyboy.fan@gmail.com>
         # @param   mixed data
         # @param   str key 标签名  默认：None
         # @return  str xml
         # @todo
        """"""""""""""""""""""""""""""""""""""""""""""""
        xml = ''
        if isinstance(data,dict) :
            for k,v in data.iteritems() :
                if isinstance(v,(list,tuple)) :
                    xml += self.create_tree(v,k)
                else :
                    xml += self.create_tag(k,self.create_tree(v))
        elif isinstance(data,(list,tuple)) :
            for v in data :
                xml += self.create_tag(key,self.create_tree(v))
        elif isinstance(data,(int,long,float)) :
            xml += str(data)
        elif getattr(data,'__dict__',None) :
            xml += self.create_tree(vars(data))
        else :
            xml += '<![CDATA[%s]]>' % data
        return xml

    def create_tag(self,tag,text='',attr={}) :
        """"""""""""""""""""""""""""""""""""""""""""""""
         # 生成单个标签结构
         #
         # @author  lazyboy <lazyboy.fan@gmail.com>
         # @param   str tag 标签名称
         # @param   str text 标签值
         # @return  str
         # @todo
        """"""""""""""""""""""""""""""""""""""""""""""""
        return '<%s>%s</%s>' % (tag,text,tag)

    def build_attr(self,attr):
        pass
